clear; clc;

err_num = 5;

% используем укороченный код RS(N,K)
N = 68;                 % Длина кодового слова (L2 frame)
K = 60;                 % Длина поля данных

m = 8;                  % т.к. работаем с байтами

% Кодер и декодер будут использовать не укороченный код RS(n1,k1)
% данные будут дополняться нулями
n1 = 2^m - 1;          
k1 = K + (n1 - N);    

% Кодер и декодер RS(n1,k1) кода
RSenc = comm.RSEncoder(n1, k1);
RSdec = comm.RSDecoder(n1, k1);

% Кодер и декодер 8b10b кода
ENC8b10b = enc8b10b;
DEC8b10b = dec8b10b;

% Случайное сообщение
msg = [randi([0, 2^m - 1], [K, 1]); zeros(n1 - N, 1)];

% Кодирование
code = step(RSenc, msg);

% 
% 8b10b кодирование и передача данных через канал
%
ch_in = [code(1:K); code(k1+1:n1)];    
ch_in8b10b = zeros(length(ch_in), 1);

for i=1:length(ch_in)
    ch_in8b10b(i) = encode(ENC8b10b, 0, 0, ch_in(i));
end

% вносим случайную ошибку (инвертируем случайный бит в случайном слове)
for i=1:err_num
    rnd_word = randi([1 N]);
    ch_in8b10b(rnd_word) = bitxor(bitshift(1, randi([0 9])), ch_in8b10b(rnd_word));    
end

ch_out = zeros(length(ch_in), 1);
for i=1:length(ch_out)
    [a,b, ch_out(i)] = decode(DEC8b10b, ch_in8b10b(i));
end

% Декодирование
code = [ch_out(1:K); zeros(n1 - N, 1); ch_out(K+1:N)];
[msg_dec, err] = step(RSdec, code);

% Проверка на наличие ошибок
if ~isequal(msg, msg_dec)
    disp('Error!');
else
    disp('Ok!');
end   

